package com.imooc.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CatTest {
    public static void main(String[] args) {

        Cat hua = new Cat("花花",12,"短毛猫");
        Cat fan = new Cat("凡凡",2,"田园猫");

        Set<Cat> set = new HashSet<Cat>();
        set.add(hua);
        set.add(fan);

        Iterator<Cat> it = set.iterator();
        while (it.hasNext()){
          System.out.println(it.next());//此时输出的是地址信息,要在Cat当中添加toString方法，重写toString方法才能得到信息，运行时会自动调用toString方法
        }
        System.out.println("**************************");

        //再添加一个一样的信息,由于会添加到set中，出现相同信息的对象，此时应在Cat类当中重写hashCode和equals方法，为了提高查询速度，hashcode分类，equals查找
        //在自定义类当中涉及到对象比较的问题，因此需要重写hashcode和equals方法来进行判断
        Cat huahua11 = new Cat("花花",12,"短毛猫");
        set.add(huahua11);
        it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());//此时输出的是地址信息,要在Cat当中添加toString方法，重写toString方法才能得到信息，运行时会自动调用toString方法
        }
        System.out.println("**************************");


        //添加对象
        Cat huahua = new Cat("花花2",12,"短毛猫");
        set.add(huahua);
        it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }


//
//        //查找花花2的信息并输出
//        if(set.contains(huahua)){
//            System.out.println(huahua);
//        }else
//        {
//            System.out.println("未找到");
//        }
//        System.out.println("********************");


        //通过名字查找
        System.out.println("名字查找");
        boolean flag = false;
        Cat c= null;//定义在外面用于存储找到的对象
        it = set.iterator();//每次循环集合时需要重新遍历，由于上一个迭代器已经调用到了末尾
        while (it.hasNext()) {
            c =  it.next();//引进泛型之后此处不需要进行强制类型转换，在类或者接口的后面写上要添加到集合当中的类型，在迭代器当中也限制
           // c = (Cat) it.next();//由于next方法得到的时Object类型的对象，因此需要强制类型转换为cat类型
            if (c.getName().equals("花花")) {
                flag = true;
                break;//找到后退出循环,并且flag值为true
            }
        }
            if(flag){
                System.out.println("找到了");
                System.out.println(c);
            }else{
                System.out.println("未找到");
            }

        System.out.println("********************");

        //删除
        //在引入泛型后还可以用增强型for循环来遍历集合
        //将集合中的数据取出依次放入cat，定义引用
        //在读取数据时不允许对数据删除
//        for(Cat cat:set){
//            if("花花".equals(cat.getName()))//若此时删除的是花花，由于不是最后一个遍历的数据，此时正处于读取数据，不能删除，解决办法为，找到数据后不在进行遍历用break
//            {
//                set.remove(cat);
//                break;
//            }
//        }


        //删除多个满足条件的数据
        //建立一个新的集合用于存储满足条件的数据,此集合为set的子集，再利用removeAll方法删除
        Set<Cat> set1 = new HashSet<Cat>();
        for(Cat cat:set){
            if(cat.getMonth()<5)
                set1.add(cat);
        }
        set.removeAll(set1);



        System.out.println("删除后");
        for(Cat cat:set){
            System.out.println(cat);
        }

        //删除集合所有数据
        boolean flag1 = set.removeAll(set);//此方法的返回值为boolean类型

        // 此处也可以用isEmpty方法判断集合是否为空
        if (flag1){
            System.out.println("删除成功");
        }else{
            System.out.println("未删除成功");
        }



    }
}
